#include "Key.h"

//定义两个全局变量,向全局传递按键值和按键状态
unsigned char uc_Key_Value;
unsigned char uc_Key_state;
unsigned char uc_Key_flag;	//定时器10ms扫描标志位

/*按键控制外部的标志位*/
float Temp_Vol_compare = 5.0;
unsigned int Temp_Frequency_compare = 30000;


//独立按键 处理其他标志位，按键按下要执行的操作
void Key4_Driver(void)
{
	
	menu_index ++;
	if (menu_index == 4) menu_index = 0;	//3界面时，按下按键4，默认返回界面0 (先判断这个)
	menu_index = menu_index%3; //3个界面(0 1 2) 索引限制
	
}
void Key5_Driver(void)
{
	if (menu_index == 2) {menu_index = 3;}
	else if (menu_index == 3) 
	{
		menu_index = 2;
		
	}

}
void Key6_Driver(void)
{
	Temp_Vol_compare = f_PCF8591__ADC_V_Data;	//按键6保存电压数据
}
void Key7_Driver(void)
{
	Temp_Frequency_compare = Frequency_Data;
}


//---------------------------------独立按键处理部分---------------------------------//
//独立按键扫描函数,读取键值(内部调用)
unsigned char Key4_Read(void)    
{
    unsigned char Key_temp;
	unsigned char Key_Value;
	
	//这两行是扫描按键的识别部分
	P3 |= 0x0f;			//读取I/O口外部电平状态前，需要先将I/O口置1 (STC15F2系列单片机I/O口上电默认为准双向口)
	Key_temp = P3&0x0f;
	
	switch(Key_temp)
	{
	    case 0x0E : Key_Value = 7; break;  //S7(P30) 0000 1110 = 0x0e
		case 0x0D : Key_Value = 6; break;  //S6(P31) 0000 1101 = 0x0D
		case 0x0B : Key_Value = 5; break;  //S5(P32) 0000 1011 = 0x0B
		case 0x07 : Key_Value = 4; break;  //S4(P33) 0000 0111 = 0x07 
		default: Key_Value = 0;
	}
	
	return Key_Value;
}

//独立按键处理函数, 外部调用函数
void Key4_Proc(void)
{
    unsigned char Key_Temp, Key_Down, Key_Up;
    static unsigned char Key_Old = 0;
	
	if(uc_Key_flag) return;  //10ms, uc_Key_flag标志位 置一次1
	uc_Key_flag = 1;	//10ms内只执行一次独立按键扫描程序
	
	Key_Temp = Key4_Read();	//独立按键扫描
	Key_Down = Key_Temp & (Key_Old ^ Key_Temp);   //按下为按键值，其它为0
	Key_Up   = ~Key_Temp & (Key_Old ^ Key_Temp);  //松手为抬起前的按键值，其他为0 
	Key_Old  = Key_Temp;	
		
	if(Key_Down)
	{
		uc_Key_state = 'd';		//按下过程中, Key_Down变量 = 相应的按键值
        uc_Key_Value = Key_Down;//按键键值, 赋值给 uc_Key_Value 变量
		
		//按下 按键处理部分
		switch(Key_Down) 
		{
			case 4: Key4_Driver(); break;
			case 5:	Key5_Driver(); break;
			case 6:	Key6_Driver(); break;
			case 7:	Key7_Driver(); break;
		}
	}
	
	if(Key_Up)
	{
		uc_Key_state = 'U';		//抬起过程中, Key_Up变量 = 抬起前的按键值
		
		//抬起 按键处理部分
//		switch(Key_Up)
//		{
//			case 4:	 break;
//			case 5:	 break;
//			case 6:	 break;
//			case 7:	 break;
//		}
	}
}




//---------------------------------矩阵按键处理部分---------------------------------//
//矩阵按键扫描函数,读取键值(内部调用)
unsigned char Key16_Read(void)    
{
    unsigned int  Key_temp;
	unsigned char Key_Value;	
	
	//按键扫描的识别部分
	P44=0; P42=1; P35=1; P34=1; P3|=0X0F; //第一列拉低，其余全为高
	Key_temp = P3;                        //读取P3低四位I/O状态,识别第一列的第几个按键被按下
	
	P44=1; P42=0; P35=1; P34=1; P3|=0X0F;  //第二列拉低，其余全为高
	Key_temp = (Key_temp<<4) | (P3&0X0F);  //读取P3低四位I/O状态
	
	P44=1; P42=1; P35=0; P34=1; P3|=0X0F; //第三列拉低，其余全为高
	Key_temp = (Key_temp<<4) | (P3&0X0F); //读取P3低四位I/O状态
	
	P44=1; P42=1; P35=1; P34=0; P3|=0X0F; //第四列拉低，其余全为高
	Key_temp = (Key_temp<<4) | (P3&0X0F);  //读取P3低四位I/O状态
	
	//有按键按下Key_temp相应位为0	
	
	//按键扫描的编码部分
	switch(~Key_temp)   
	{
		case 0X8000: Key_Value = 4; break;   //S4
		case 0X4000: Key_Value = 5; break;   //S5
		case 0X2000: Key_Value = 6; break;   //S6
		case 0X1000: Key_Value = 7; break;   //S7
		
		case 0X0800: Key_Value = 8; break;   //S8
		case 0X0400: Key_Value = 9; break;   //S9
		case 0X0200: Key_Value = 10; break;   //S10
		case 0X0100: Key_Value = 11; break;   //S11
		
		case 0X0080: Key_Value = 12; break;   //S12
		case 0X0040: Key_Value = 13; break;   //S13
		case 0X0020: Key_Value = 14; break;   //S14
		case 0X0010: Key_Value = 15; break;   //S15
		
		case 0X0008: Key_Value = 16; break;   //S16
		case 0X0004: Key_Value = 17; break;   //S17
		case 0X0002: Key_Value = 18; break;   //S18
		case 0X0001: Key_Value = 19; break;   //S19
		
		default: Key_Value = 0;  //无按键按下
	}
	return Key_Value;	
}

//矩阵键盘处理函数, 外部调用函数
void Key16_Proc(void)	
{
    unsigned char Key_Value, Key_Down, Key_Up;
    static unsigned char Key_Old = 0;
	
	if(uc_Key_flag) return;  //10ms
	uc_Key_flag = 1;
	
	Key_Value = Key16_Read();
	Key_Down = Key_Value & (Key_Old ^ Key_Value);   //按下为按键值，其它为0
	Key_Up  = ~Key_Value & (Key_Old ^ Key_Value);  //松手为抬起前的按键值，其他为0 
	Key_Old = Key_Value;

	if(Key_Down)
	{
	  uc_Key_state = 'd';
	  uc_Key_Value = Key_Down;

	}
	
	if(Key_Up)
	{
	  uc_Key_state = 'U';
      uc_Key_Value = Key_Up;
	}
}

//---------------------------------按键扩展处理部分---------------------------------//
//长按 双击 复合
